package cn.jsj.onclock.service.impl;

import cn.jsj.onclock.dao.LabelDao;
import cn.jsj.onclock.exception.CustomException;
import cn.jsj.onclock.exception.CustomerErrorException;
import cn.jsj.onclock.pojo.LabelEnt;
import cn.jsj.onclock.pojo.identity.UserIdentityEnum;
import cn.jsj.onclock.service.LabelService;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;


/**
 * @author 卢斌
 */
@Service
public class LabelServiceImpl implements LabelService {


    private final LabelDao labelDao;

    @Autowired
    public LabelServiceImpl(LabelDao labelDao) {
        this.labelDao = labelDao;
    }

    /**
     * Id获取标签实体 （不需要验证用户身份）
     *
     * @param labelId   标签卡Id
     * @return  标签实体
     */
    @Override
    public LabelEnt getOneLabelById(Long labelId) {
        return labelDao.getLabelEntById(labelId);
    }


    /**
     * 查询全部的签到标签
     *
     * @param pageNum  页码号
     * @param pageSize 页容量
     * @return 全部的签到标签
     */
    @Override
    public List<LabelEnt> listAllLabel(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return labelDao.listAllLabel();
    }


    /**
     * 查询符合名称前缀的标签列表
     *
     * @param titlePrefix 前缀
     * @param pageNum     页码号
     * @param pageSize    页容量
     * @return 符合前缀名称的标签列表
     */
    @Override
    public List<LabelEnt> listLabelLikeTitlePrefix(String titlePrefix, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return labelDao.listLabelLikeTitlePrefix(titlePrefix);
    }

    /**
     * 模糊查询标签
     *
     * @param pareTitle 名称片段
     * @return 模糊查询结果
     */
    @Override
    public List<LabelEnt> listLabelLikeTitle(String pareTitle) {
        return labelDao.listLabelLikeTitleAllName(pareTitle);
    }

    /**
     * 管理员录入标签卡信息
     *
     * @param identity          用户身份标识
     * @param title             标签卡名称
     * @param labelNum          标签卡唯一标识
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertOneLabel(UserIdentityEnum identity, String title, String labelNum) {
        if (UserIdentityEnum.hasPowerOfInputLabel(identity)) {
            LabelEnt labelEnt = labelDao.getLabelEntByLabelNum(labelNum);
            if (labelEnt != null) {
                throw new CustomException("该标签卡已经存在系统中，无需重复录入");
            }
            LabelEnt insertBody = new LabelEnt();
            insertBody.setLabelNum(labelNum);
            insertBody.setTitle(title);
            labelDao.insertLabel(insertBody);
        } else {
            throw new CustomException("您没有录入标签卡的权限");
        }

    }

    /**
     * 管理员更新标签名称
     *
     * @param labelId    标签卡Id
     * @param identity   操作者身份
     * @param labelTitle 标签新名称
     */
    @Override
    @Transactional(rollbackFor = CustomerErrorException.class)
    public void updateLabelTitle(Long labelId, UserIdentityEnum identity, String labelTitle) {
        if (! UserIdentityEnum.hasPowerOfRenameLabel(identity)) {
            throw new CustomException("用户暂无修改标签卡名称的权限");
        }
        Integer influenceNumber = labelDao.updateLabelName(labelTitle, labelId);
        if (influenceNumber != 1) {
            throw new CustomerErrorException("标签卡名称更新失败");
        }
    }


}
